package com.leo.persistence.io;

import java.io.InputStream;


/**
 * 1. Class.getResource(String path)
 *      1.1 path不以'/'开头时, 默认是从此类所在的包下取资源
 *      1.2 path以'/'开头时, 则是从项目的ClassPath根下获取资源
 *
 * 2. Class.getClassLoader().getResource(String path)
 *      2.1 path不能以'/'开头，path是指类加载器的加载范围, '/'表示Boot ClassLoader，类加载器中的加载范围
 *          因为是C++实现, 所以永远是null, 所以只能从classpath下获取资源
 *
 * 两者本质都是使用了ClassLoader.getResource()加载资源
 *
 * -----------------------------------------------
 *
 * 3. Class.getResourceAsStream(String path)
 *      3.1 path不以'/'开头时，默认是指所在类的相对路径，从这个相对路径下取资源；
 *      3.2 path以'/'开头时，则是从项目的classpath根下获取资源，就是要写相对于classpath根下的绝对路径
 *
 *      com
 *      |-github
 *              |-demo
 *              |    |-A.class
 *              |    |-1.txt
 *              |-B.class
 *              |-2.txt
 *
 *      InputStream is = A.class.getResourceAsStream("1.txt"); // 相对A类的路径
 *      InputStream is = A.class.getResourceAsStream("../2.txt"); // 相对A类的路径, 倒退一级目录
 *      InputStream is = A.class.getResourceAsStream("/com/github/demo/1.txt"); //绝对路径(从classpath算起)
 *      InputStream is = A.class.getResourceAsStream("/com/github/2.txt");  //绝对路径(从classpath算起)
 *
 *
 * 4. Class.getClassLoader.getResourceAsStream(String path)
 *    默认则是从ClassPath根下获取，path不能以’/'开头，最终是由ClassLoader获取资源
 *
 *    适用于上面规则
 *    InputStream ins = ClassLoader.getSystemResourceAsStream("com/github/demo/1.txt");
 *    InputStream ins = ClassLoader.getSystemResourceAsStream("com/github/2.txt");
 *
 *
 * 总结: 本质都是使用ClassLoader读取资源,
 *      只是ClassLoader默认都是从classpath根路径开始, '/'表示的是BootstrapClassLoader加载范围, 由于是C++实现的不可见, 所以范围为null
 *      基于Class类的加载资源, 可以使用'/'是由于做了一层包装(resolveName)
 */
public class Resources {

    /**
     * Class.getClassLoader().getResource(String path)
     * 默认则是从ClassPath根下获取，path不能以’/'开头，最终是由ClassLoader获取资源
     * @param path
     * @return
     */
    public static InputStream getResourceAsStream(String path){
        InputStream inputStream = Resources.class.getClassLoader().getResourceAsStream(path);
        return inputStream;
    }
}
